/**
 * @file HttpRequest.h
 * @brief
 * 对HTTP请求进行封包和拆包，HTTP请求的报文格式主要有三个部分：请求行、请求头部、请求包体
 * HTTP报文格式如下：
 * ----------------------------------------------------------------
 * 请求方法 空格 URL 空格 协议版本 回车符 换行符  ---> 请求行
 * 头部字段名称 :（冒号） 值 回车符 换行符        -|
 *               ......                         -|---> 请求头部
 * 头部字段名称 :（冒号） 值 回车符 换行符        -|
 *            回车符 换行符
 * 请求包体                                     ---> 请求包体
 *-----------------------------------------------------------------
 *
 * @author Wang haoyu
 * @email 136046355@qq.com
 */
#ifndef __HTTPREQUEST_H__
#define __HTTPREQUEST_H__

#include <string>
#include <map>

class HttpRequest
{
  public:
    enum Method
    {
        kInvalid,
        kGet,
        kPost,
        kHead,
        kPut,
        kDelete
    };
    enum Version
    {
        kUnknown,
        kHttp10,
        kHttp11
    };
    enum Header
    {
        kHost,
        kUserAgent,
        kAccept
    };

    const std::string CRLF = "\r\n";

  public:
    Method method_;     // 请求方法，比如GET
    Version version_;   // 协议版本，比如HTTP/1.1
    std::string path_;  // 请求路径，比如:127.0.0.1:2379
    std::string query_; // URL,比如：/version
    std::map<std::string, std::string> headers_; // 请求头

  public:
    HttpRequest();
    HttpRequest(std::string query);
    HttpRequest(Method method, Version version, std::string query);
    ~HttpRequest();

    bool setHeader(Header headerName, std::string value);

    std::string packageSendData();

  private:
    bool methodParse(std::string &data);
    bool versionParse(std::string &data);
    void packageHeaders(std::string &data);
};

#endif // __HTTPREQUEST_H__
